<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.14"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>LibQQt: Multi-link Technology</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">LibQQt
   &#160;<span id="projectnumber">v3.1</span>
   </div>
   <div id="projectbrief">开源、跨平台Qt应用程序框架中间件</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">Multi-link Technology </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h2>项目介绍</h2>
<p>为应用程序和链接库工程开发的，实现链接、发布依赖Library，发布SDK，发布应用，发布语言、配置等工程管理功能的多链接技术。 <br />
Multi-link技术使用众多的pri进行函数定义，提供给用户丰富的App/Lib生产线操作函数，省却手动拷贝App、Lib、依赖令手痛的问题。 <br />
我编写的Multi-link技术使用内置支持Library的方式支持众多的Library，方便共享对Library的支持，并且方便准确及时地同步到工程中进行使用，基本上编写一次，便不必再修改。 <br />
用户有使用方便的Library可以给我发邮件，tianduanrui@163.com.把add_library_XXX.pri发给我。我会把它提交到Multi-link工程里。 <br />
Multi-link技术位于全自动化构建技术的最关键的位置，即源代码工程全自动化构建、生产。</p>
<h2>功能清单</h2>
<ol type="1">
<li>跨windows、macOS、linux(笔者使用ubuntu kylin x64)三个平台，功能已经全面完成。</li>
<li>这些功能，就是在qmake阶段设置好所有的用户过去需要手动做的工作，通过QMAKE_POST_LINK自动完成。</li>
<li>add_function.pri add_project.pri里面提供了丰富的基本功能，用户可以用其扩展技术外功能。</li>
<li>add_deploy() 发布app到app发布目录 用于app工程。</li>
<li>add_sdk() 发布sdk到sdk目录 用于library工程。</li>
<li>add_dependent_manager() 为工程添加依赖的SDK，它会到SDK目录查找具体的SDK，输入参数，sdk包名，sdk包内子模块名。比如：Qt, Widgets.这里吆告诉读者，把Qt SDK放到SDK目录里也有效果。通常这一个函数链接库的SDK就够用了，里面包含了add_include() 包含头文件路径 add_library() 链接库 add_defines() 添加library的宏定义 add_deploy_library() 把库跟随app发布到app发布目录。</li>
<li>add_deploy_config() 将指定路径的配置文件发布到build路径和product发布路径。</li>
<li>add_icons() 为应用程序添加logo，尤其windows和macOS下。</li>
<li>add_language() 为应用程序添加翻译文件，自动添加翻译文件，用户只需要找到文件翻译下就可以了。</li>
</ol>
<ol type="1">
<li>add_version() 为应用程序添加版本信息。</li>
</ol>
<h2>提供的工具</h2>
<p>经过发布的App直接点击就可以运行，*大的省去了用户手动发布App的劳烦过程。 <br />
*Multi-link提供ProductExecTool，可以对产品集中查看、调用运行。* <br />
*Multi-link提供AddLibraryTool，方便用户通过准备好的SDK自动生成add_library_xxx.pri链接环。* <br />
*Multi-link提供AddLibraryTool-Multiple，可以同时对多套SDK进行生成链接环。* <br />
*Multi-link提供Multi-linkConfigTool，方便用户配置Multi-link v2必需的三大路径，build/sdk/deploy root。* <br />
*Multi-link提供SdkListTool，方便用户查看已经准备好的SDK在各个平台准备情况的表格。* <br />
 </p><h2>软件架构</h2>
<p><a href="Multi-linkFunctionList.xlsx">多链接技术的工程结构.xlsx</a> <br />
由于Qt第四代编译比较困难，Qt4内置的qmake版本2.01a版本太低，对函数的支持不足，对嵌套函数的支持也不足， <br />
所以，Multi-link2.0不支持Qt4。 <br />
Multi-link1.0绑定QQt，也不会继续开发与QQt脱离的纯粹使用pri的版本，Qt4 qmake版本太低，不便于开发。 <br />
 </p><h2>安装教程</h2>
<ol type="1">
<li>在用户主目录/.qmake/app_configure.pri里面配置三个变量(Only Once) <br />
 - LIB_SDK_ROOT = /home/abel/Develop/b1-sdk<ul>
<li>APP_BUILD_ROOT = /home/abel/Develop/c0-buildstation</li>
<li>APP_DEPLOY_ROOT = /home/abel/Develop/b0-product</li>
<li>可以编译运行Multi-linkConfigTool，实现一次图形化的配置，配置好了还会兼容Multi-link 1.0.</li>
<li>配置一次就可以了，Multi-link提供的其他工具就都可以用了。 <br />
2. 在project build configure页面配置构建环境变量，QSYS=Windows等指示平台变量（参见add_platform.pri）。</li>
<li>这个是每次每个build都需要配置的，这个有Qt Creator的开发历史原因。 <br />
 <h2>使用说明</h2>
</li>
</ul>
</li>
</ol>
<ol type="1">
<li>一个可以拷贝multi-link到自己工程目录，<ul>
<li>一个可以clone multi-link到公共位置</li>
<li>一个可以clone multi-link到工程目录作为submodule。这个是推荐方式，我对链接库们的支持容易使用到自己的工程里，我一般使用这个方式。</li>
</ul>
</li>
<li>include (.../multi-link/add_base_manager.pri) <br />
4. add_version() add_deploy() add_dependent_manager(QQt) add_dependent_manager(XXXLib) ...</li>
<li>如果希望添加自定义模块，如果希望添加自己使用的其他的app-lib没支持的库，<ul>
<li>那么从multi-link/app-lib里拷贝add_custom_manager.pri到工程目录（optional，Multi-link 1.0）。 <br />
 - 使用AddLibraryTool写自定义的add_library_XXX.pri（Multi-link 2.0），然后拷贝这个pri到工程目录，或者到Multi-link的app-lib目录，使用add_custom_dependent_manager(XXX)/add_dependent_manager(XXX)调用. <br />
 详细使用说明 <br />
</li>
</ul>
</li>
</ol>
<h2>使用截图</h2>
<p>屏幕截图 <br />
</p>
<h2>约束</h2>
<ol type="1">
<li>源代码目录里multi-link目录有必要和代码目录平级。不应当把multi-link文件夹放到src目录里。 <br />
2. macOS下，一切被依赖的Library不可以和依赖者App或者Library共同编译。免于触发first-time bug。<ul>
<li>已经修复。修改了搬运软件的时机。 <br />
3. macOS下，工程的CONFIG，从+lib_bundle变化到-lib_bundle，需要手动删除工程编译目录里的所有framework。</li>
<li>cp命令的行为，我至今不明确。</li>
</ul>
</li>
</ol>
<h2>总结</h2>
<p>看起来挺巨大的？工程量的确不小。 <br />
初学者注意看： <br />
1. 第一次使用，拿到Multi-link技术的仓库，使用Multi-link.pro编译Multi-linkConfigTool，配置三个主要路径。</p><ul>
<li>在这台电脑上，Multi-link Technology（qmake）开始臣服于你。 <br />
2. 顺便配置好Qt Creator吧，这两步只需要配置一次，这一步还是optional，配置下比较美观，反正就一次。 <br />
 - 菜单栏-工具-选项-构建和运行<ul>
<li>概要，设置你喜欢的，我建议的默认编译路径。</li>
<li>构建套件，对每个Kit设置你喜欢，我建议的File system name。SDK路径、Deploy路径下面，肯定是使用我的建议的File system name。 <br />
 初学者，可以拿依赖Multi-link技术的LIB工程和APP工程。 <br />
1. 用Qt Creator打开工程.pro。</li>
</ul>
</li>
<li>选择几个目标configure project。(.pro.user)。这是最开始。</li>
<li>左侧菜单-项目-Build&amp;Run-Build-构建设置-构建环境-详情 <br />
 - 批量编辑，添加QSYS=Windows/macOS/Linux64/Android/Armhf32/iOS等选一，targetName就是上边我建议的File system name，在add_platform.pri里边能找到。 <br />
2. 用Qt Creator编译源代码工程</li>
<li>工程树-工程名-鼠标右键<ul>
<li>执行qmake。 =qmake</li>
<li>构建。 =make</li>
</ul>
</li>
<li>到SDK仓，产品库看看吧，有产品了。<ul>
<li>SDKListTool，可以帮助查看SDK仓。</li>
<li>ProductExecTool，可以帮助运行产品库里的软件。</li>
</ul>
</li>
</ul>
<p>用Qt Creator编辑源代码工程 <br />
 - 这个没什么可说的，按照常规使用Qt Creator编辑源代码的习惯编辑即可。 <br />
 - 切记，使用Multi-link技术，只要使用其提供的qmake函数，千万不要去手动触碰SDK，甚至App。这是Multi-link技术的初衷。 <br />
</p>
<h2>联系我</h2>
<p>邮箱： <a href="#" onclick="location.href='mai'+'lto:'+'tia'+'nd'+'uar'+'nu'+'i@1'+'63'+'.co'+'m'; return false;">tiand<span style="display: none;">.nosp@m.</span>uarn<span style="display: none;">.nosp@m.</span>ui@16<span style="display: none;">.nosp@m.</span>3.co<span style="display: none;">.nosp@m.</span>m</a> <br />
QQ: 2657635903 </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.14
</small></address>
</body>
</html>
